#include "Archivos.h"
#include <iostream>



AdminArchivos::AdminArchivos(char* path)
{
    filename = path;
    file_OK = false;
}




bool AdminArchivos::openFile(int accion)
{
    if(accion == 1)
    {
        file.open(filename,ios::in|ios::out|ios::trunc);
    }
	
    else
	{
		if(accion == 2)
			file.open(filename, ios::in|ios::app);
		else 
		{
			if(accion == 3)
				file.open(filename, ios::in|ios::out|ios::app);
			else
				return true;
		}
	}
	

    return file_OK = file.good();
}


bool AdminArchivos::closeFile()
{
    file.close();
    return file_OK = file.good();
}


bool AdminArchivos::reset()
{
    file.clear();
    file.seekg(0);
    return file_OK = file.good();
}


bool AdminArchivos::gotoEnd()
{
    file.clear();
    file.seekg(0,ios::end);
    return file_OK = file.good();
}


bool AdminArchivos::seek(long num)
{
    file.clear();
    file.seekg(num);
    return file_OK = file.good();
}


bool AdminArchivos::puedeLeer() const
{
    return file_OK;
}




//---------------Para Pasillo---------------------------------------------
bool AdminArchivos::writePasillo(Pasillo* obj)
{
    file<<*obj;
    file.flush();
    return file_OK = file.good();
}


Pasillo* AdminArchivos::readPasillo()
{
    Pasillo *obj = new Pasillo();
	file>> *obj;
	if(obj->getNombre() == "")
	{
		return NULL;
	}
    return obj;
    
}




bool AdminArchivos::grabarListaPasillo(ListaDoble<Pasillo>* list)
{
    
    if(list != NULL && openFile(1))
    {
        list->setActual(list->getPrimero());
        while(list->getActual() != NULL)
        {
            Pasillo *pas = list->getActual()->getInfo();
            if(writePasillo(pas)&& file.good())
                list->setActual(list->getActual()->getSigNodo());
            else 
				return false;
        }
        return true;
    }
    else
    {
        return false;
    }

}


ListaDoble<Pasillo>* AdminArchivos::levantarListaPasillo()
{
    ListaDoble<Pasillo> *list = new ListaDoble<Pasillo>;
    if(openFile(2))
    {
        Pasillo* est = readPasillo();

        if(est != NULL)
        {
			list->insertarUltimo(est);
            
            while(!file.eof())
            {
                Pasillo *est;
                est = readPasillo();
                if(file.good() && est != NULL)
                {
					list->insertarUltimo(est);
                }
            }
        }
    }
    return list;
}
//------------------------------------------------------------------------------------


// TipoProducto

bool AdminArchivos::writeTipoProducto(TipoProducto* obj)
{
    file<<*obj;
    file.flush();
    return file_OK = file.good();
}


TipoProducto* AdminArchivos::readTipoProducto()
{
    TipoProducto *obj = new TipoProducto();
	file>> *obj;
	if(obj->getNombre() == "")
	{
		return NULL;
	}
    return obj;
}




bool AdminArchivos::grabarListaTipoProducto(ListaCircular<TipoProducto>* list, int accion)
{
    
    if(list != NULL && openFile(accion))
    {
        list->setActual(list->getPrimero());
        file<<list->getCantidad()<<endl;
        
        if(list->getPrimero() != NULL)
        {
            TipoProducto *pas = list->getActual()->getInfo();
            if(writeTipoProducto(pas)&& file.good())
                list->setActual(list->getActual()->getSigNodo());
            else 
                return false;
        }
        
        while(list->getActual() != list->getPrimero())
        {
            TipoProducto *pas = list->getActual()->getInfo();
            if(writeTipoProducto(pas)&& file.good())
                list->setActual(list->getActual()->getSigNodo());
            else 
				return false;
        }
        return true;
    }
    else
    {
        return false;
    }

}


ListaCircular<TipoProducto>* AdminArchivos::levantarListaTipoProducto(int aux2)
{
    ListaCircular<TipoProducto> *list = new ListaCircular<TipoProducto>;
    if(openFile(aux2))
    {
		string aux;
		file>>aux;
		if(aux == "")
			return list;
		
		int cant = atoi(aux.c_str());
		if(cant == 0)
			return list;
		
        TipoProducto* est = readTipoProducto();
        if(est != NULL)
        {
			cant--;
			int cont=0;
            list->insertarUltimo(est);
            while(!file.eof() && cont<cant)
            {
                TipoProducto *est;
                est = readTipoProducto();
                if(file.good() && est != NULL)
                {
                    list->insertarUltimo(est);
					cont++;
                }
            }
        }
    }
	else
	{
		cout<<"\nfallo openFile(2) en levantar lista tipoproducto\n";
		//system("pause");
	}
    return list;
}